package interfacesFerrovia;

/**
 * Interface a ser implementada pelo Centro de Controle, que sera o responsavel pelo tratamento
 * de eventos gerados pela malha ferroviaria.
 *   Define os metodos chamados pela malha ferroviaria na ocorrencia de cada evento gerado pela malha..
 *   Todo evento tem as seguintes informacoes:
 *   - tipo do evento: o tipo de evento e implicito pelo metodo sendo chamado.
 *   - id_origem: identificacao unica do elemento que gerou o evento (composicao ou trecho de ferrovia)
 *   - instante da ocorrencia do evento
 *   - dados do evento (cada tipo de evento tem um conjunto proprio de dados, descritos junto com cada 
 *     metodo.
 * @author Fernando Vanini
 *
 */

public interface TratadorDeEventos extends DefsGlobais{
	
	/**
	 * Evento de alarme gerado por uma composicao, por falha de operacao
	 * @param idComposicao   Identificacao unica da composicao
	 * @param instanteAtual  Instante da ocorrencia do evento
	 * @param tipoDeFalha    Tipo da falha: (Aceleracao, Freio, Outra [ ver definicoes em DefsGlobais.java])
	 */
	public void alarmeComposicao(String idComposicao, int instanteAtual, TipoFalha tipoDeFalha );
	
	/**
	 * Evento gerado pela composicao quando a mesma inicia sua viagem.
	 * @param idComposicao   Identificacao unica da composicao
	 * @param instanteAtual  Instante da ocorrencia do evento
	 * @param idTrecho       Identificacao unica do trecho de onde a composicao parte.
	 */
	public void partidaComposicao(String idComposicao, int instanteAtual, String idTrecho);
	
	/**
	 * Evento gerado pela composicao quando esta chega ao seu destino.
	 * @param idComposicao  Identificacao unica da composicao.
	 * @param instanteAtual Instante da ocorrencia do evento.
	 * @param idTrecho      Identificacao do trecho pelo qual ocorreu a chegada.
	 */
	public void chegadaComposicao(String idComposicao, int instanteAtual, String idTrecho);
	
	/**
	 * Evento de alarme gerado pela chave, por falha de operacao.
	 * @param idChave         Identificacao unica da chave que gerou o alarme.
	 * @param instanteAtual   Instante da ocorrencia do evento.
	 * @param tipoDeFalha     Tipo de falha da chave.
	 */
	public void alarmeChave(String idChave, int instanteAtual, TipoFalha tipoDeFalha );	
	
	/**
	 * Evento gerado pela passagem de uma composicao por um sensor.
	 * @param idTrecho       Identificacao unica do trecho que gerou o evento.
	 * @param instanteAtual  Instante da ocorrencia do evento.
	 * @param posicao        Posicao do sensor que gerou o evento, relativa a extremidade A do sensor.
	 * @param idComposicao   Identificacao unica da composicao.
	 * @param velocidade     Velocidade da composicao no instante da passagem.
	 * @param sentidoAB      Sentido da passagem (AB => true, BA => false)
	 */
	public void passagemComposicao(String idTrecho, int instanteAtual, float posicao, String idComposicao, float velocidade, boolean sentidoAB);
	
	/**
	 * Evento gerado pela entrada de uma composicao numa chave.
	 * @param idChave           Identificacao unica da chave que gerou o evento.
	 * @param instanteAtual     Instante da ocorrencia do evento.
	 * @param idComposicao      Identificacao da composicao que entrou na chave
	 * @param idTrechoOrigem    Identificacao do trecho de onde veio a composicao
	 */
	public void entradaComposicaoChave(String idChave, int instanteAtual, String idComposicao, String idTrechoOrigem);

	/**
	 * Evento gerado pela saida de uma composicao de uma chave.
	 * @param idChave          Identificacao unica da chave que gerou o evento.
	 * @param instanteAtual     Instante da ocorrencia do evento.
	 * @param idComposicao      Identificacao da composicao que saiu da chave
	 * @param idTrechoDestino   Identificacao do trecho para onde esta indo a composicao
	 */
	public void saidaComposicaoChave(String idChave, int instanteAtual, String idComposicao, String idTrechoDestino);
	
	/**
	 * Evento gerado para cada 'tic' do relogio do simulador.
	 * @param instanteAtual instante em que o 'tic' ocorre (relativo ao inicio da simulacao)
	 */
	public void tic(int instanteAtual);
	
}
